<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h2>一、是什么</h2>
  <div>函数式编程是一种"编程范式"（programming paradigm），一种编写程序的方法论</div>
  <br>
  <div>主要的编程范式有三种：命令式编程，声明式编程和函数式编程</div>
  <br>
  <div>简单来讲，就是要把过程逻辑写成函数，定义好输入参数，只关心它的输出结果。即是一种描述集合和集合之间的转换关系，输入通过函数都会返回有且只有一个输出值</div>
  <h2>二、概念</h2>
  <h4>纯函数</h4>
  <div>函数内部传入指定的值，就会返回确定唯一的值,不会造成超出作用域的变化，例如修改全局变量或引用传递的参数</div>
  <h4>高阶函数</h4>
  <div>高级函数，就是以函数作为输入或者输出的函数被称为高阶函数</div>
  <br>
  <div>在我们的编程世界中，我们需要处理的其实也只有“数据”和“关系”，而关系就是函数,编程工作也就是在找一种映射关系，一旦关系找到了，问题就解决了，剩下的事情，就是让数据流过这种关系，然后转换成另一个数据，</div>
  <h2>柯里化</h2>
  <div>柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程</div>
  <div>柯里化函数的意义</div>
  <br>
  <div>1.让纯函数更纯，每次接受一个参数，松散解耦。2.惰性执行</div>
  <h4>组合与管道</h4>
  <div>组合函数，目的是将多个函数组合成一个函数</div>
  <br>
  <div>组合函数与管道函数的意义在于：可以把很多小函数组合起来完成更复杂的逻辑</div>
  <script>
    // function afn(a) {
    //   return a * 2;
    // }
    // function bfn(b) {
    //   return b * 3;
    // }
    // const compose = (a, b) => c => a(b(c));
    // let myfn = compose(afn, bfn);
    // console.log(myfn(2));
    // const compose = (...fns)=>val=>fns.reverse().reduce((acc,fn)=>fn(acc),val);
    // const pipe = (...fns)=>val=>fns.reduce((acc,fn)=>fn(acc),val);
  </script>
  <h2>三、优缺点</h2>
  <div>优点</div>
  <ul>
    <li>更好的管理状态：因为它的宗旨是无状态，或者说更少的状态，能最大化的减少这些未知、优化代码、减少出错情况</li>
    <li>更简单的复用：固定输入->固定输出，没有其他外部变量影响，并且无副作用。这样代码复用时，完全不需要考虑它的内部实现和外部影响</li>
    <li>更优雅的组合：往大的说，网页是由各个组件组成的。往小的说，一个函数也可能是由多个小函数组成的。更强的复用性，带来更强大的组合性</li>
    <li>隐性好处。减少代码量，提高维护性</li>
  </ul>
  <div>缺点</div>
  <ul>
    <li>性能：函数式编程相对于指令式编程，性能绝对是一个短板，因为它往往会对一个方法进行过度包装，从而产生上下文切换的性能开销</li>
    <li>资源占用：在 JS 中为了实现对象状态的不可变，往往会创建新的对象，因此，它对垃圾回收所产生的压力远远超过其他编程方式</li>
    <li>递归陷阱：在函数式编程中，为了实现迭代，通常会采用递归操作</li>
  </ul>
</body>

</html>